﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Threading;

namespace System.Windows
{
    public static class MessageQueueHepler
    {/// <summary>
     /// 强制处理UI消息队列
     /// Processes all UI messages currently in the message queue.
     /// </summary> 
        public static void DoEvents( )
        {
            // Create new nested message pump.

            DispatcherFrame nestedFrame = new DispatcherFrame();

            // Dispatch a callback to the current message queue, when getting called,

            // this callback will end the nested message loop.

            // note that the priority of this callback should be lower than the that of UI event messages.

            DispatcherOperation exitOperation = Dispatcher.CurrentDispatcher.BeginInvoke(
                                                  DispatcherPriority.Background, new DispatcherOperationCallback(ExitFrame), nestedFrame);

            // pump the nested message loop, the nested message loop will

            // immediately process the messages left inside the message queue.
            Dispatcher.PushFrame(nestedFrame); 

            // If the "exitFrame" callback doesn't get finished, Abort it.

            if (exitOperation.Status != DispatcherOperationStatus.Completed)
            {
                exitOperation.Abort();
            }
        }

        private static Object ExitFrame(Object state)
        {
            DispatcherFrame frame = state as DispatcherFrame;
            // Exit the nested message loop.
            frame.Continue = false;
            return null;
        }
    }
}
